#include <iostream>
#include <unistd.h>
#include <functional>
#include <signal.h>
#include <sys/types.h>
#include <cstdio>
#include <vector>

// void PrintPending(sigset_t &pending)
// {
//     printf("我是一个进程(%d), pending: ", getpid());
//     for (int signo = 31; signo >= 1; signo--)
//     {
//         if (sigismember(&pending, signo))
//         {
//             std::cout << "1";
//         }
//         else
//         {
//             std::cout << "0";
//         }
//     }
//     std::cout << std::endl;
// }

// void handler(int sig)
// {
//     std::cout<<"###############################"<<std::endl;
//     std::cout << "递达" << sig << "信号" << std::endl;
//     sigset_t pending;
//     int m = sigpending(&pending);
//     PrintPending(pending);
//     std::cout<<"###############################"<<std::endl;
// }

// int main()
// {
//     signal(SIGINT, handler);
//     // 1.屏蔽2号信号 
//     sigset_t block, oblock;
//     sigemptyset(&block);
//     sigemptyset(&oblock);

//     sigaddset(&block, SIGINT);
//     // sigaddset(&block, SIGHUP);

//     // for(int i=1;i<32;i++)
//     // {
//     //     sigaddset(&block,i);//屏蔽所有信号(9号信号无法被屏蔽！)
//     // }

//     int n = sigprocmask(SIG_SETMASK, &block, &oblock);
//     (void)n;

//     // 4.重复获取打印过程
//     int cnt = 0;
//     while (true)
//     {
//         // 2.获取判定信号集
//         sigset_t pending;
//         int m = sigpending(&pending);

//         // 3.打印
//         PrintPending(pending);

//         if (cnt == 10)
//         {
//             // 5.解除屏蔽
//             sigprocmask(SIG_SETMASK, &oblock, nullptr);
//             std::cout << "解除对2号的屏蔽" << std::endl;
//         }

//         cnt++;
//         sleep(1);
//     }

//     return 0;
// }

// void handler(int sig)
// {
//     std::cout << "hello sig: " << sig << std::endl;
//     signal(2, SIG_DFL); //默认动作是终止信号的捕捉
//     std::cout << "恢复处理动作" << std::endl;
// }

// int main()
// {
//     signal(2, handler); // 自定义捕捉
//     while (true)
//     {
//         sleep(1);
//         std::cout << "." << std::endl;
//     }
// }

// struct task_struct
// {
//     pid_t id;
//     int count=10;//时间片，本质就是一个计数器
//     void (*code)();
// };
// std::vector<task_struct> task_list;

// ////////////func////////////
// void Sched()
// {
//     std::cout << "我是进程调度" << std::endl;
//     t.cout--;
//     if(t.cout<=0)
//     {
//         //切换进程
//     }
// }
// void MenManger()
// {
//     std::cout << "我是周期性的内存管理，正在检查有没有内存问题" << std::endl;
// }
// void Fflush()
// {
//     std::cout << "我是刷新程序，我在定期刷新内存数据到磁盘" << std::endl;
// }
// ////////////////////////////

// using func_t = std::function<void()>;

// std::vector<func_t> funcs;
// int timestep=0;

// // 每隔一秒完成一次任务
// void handlersig(int sig)
// {
//     timestep++;
//     std::cout << "##################################" << std::endl;
//     for (auto f : funcs)
//     {
//         f();
//     }
//     std::cout << "##################################" << std::endl;
//     int n = alarm(1);
// }

// int main()
// {
//     funcs.push_back(Sched);
//     funcs.push_back(MenManger);
//     funcs.push_back(Fflush);

//     signal(SIGALRM, handlersig);
//     alarm(1); // 设定1s闹钟，1s之后，当前进程收到一个信号

//     while (true) // 类似操作系统！！！
//     {
//         ；‘
//         pause();
//     }
// }

// int main()
// {
//     // for (int i = 1; i <= 32; i++)
//     // {
//     //     signal(i, handlersig);
//     // }

//     // signal(SIGALRM, handlersig);
//     // alarm(1); // 设定1s闹钟，1s之后，当前进程收到一个信号

//     while (true)
//     {
//         // 本质是IO xshell->./XXX->云服务器->网络->我们看到
//         //std::cout << "cnt: " << cnt++ << std::endl; //打印效率不高！
//         // cnt++;
//         std::cout<<",."<<std::endl;
//         //sleep(1);
//         pause();
//     }
//     return 0;
// }